package com.epadmin.kursant;

import java.util.Date;

import com.ep.general.ActionSupportCustom;
import com.ep.general.app.Utils;
import com.ep.general.kursant.Kursant;
import com.ep.general.kursant.KursantMdt;
import com.epadmin.app.login.LoginRequierd;

public class KursantAction extends ActionSupportCustom<Kursant> implements LoginRequierd {

	private static final long serialVersionUID = 95388873126495071L;
	private final String KURSANT_KEY = "kursant";
	private int kursantId;
	private KursantMdt kursantMdt;
	private KursantForm form;

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}

	public String list() {
		setDataArray(new KursantView().getData());
		return DATA_ARRAY;
	}

	private boolean isValid(Kursant item, boolean editState) {
		if (!editState && !getKursantMdt().isLoginUnique(item.getLogin())) {
			setText("Podany login już istnieje !");
			return false;
		}

		if (item.getHaslo().length() < 5) {
			setText("Wymagana długość hasła to 5 znaków !");
			return false;
		}

		if (item.getPesel().length() != 11) {
			setText("Pesel składa się z 11 znaków");
			return false;
		}

		if (item.getTelefon().length() < 8 || item.getTelefon().length() > 15) {
			setText("Telefon maksymalnie 15 znaków, minimalnie 8 znaków");
			return false;
		}

		return true;
	}

	public String add() {
		getForm().setImie("");
		getForm().setNazwisko("");
		getForm().setLogin("");
		getForm().setHaslo("");
		getForm().setImie2("");
		getForm().setEmail("");
		getForm().setDataUrodzin(new Date());
		getForm().setPesel("");
		getForm().setTelefon("");
		getForm().setKategoria("");
		getForm().setUwagi("");
		getForm().setGodzJazdy(0);
		getForm().setGodzJazdy(0);

		getSession().remove(KURSANT_KEY);
		getSession().put(KURSANT_KEY, getForm());

		return EDIT;
	}

	public String edit() {
		getSession().remove(KURSANT_KEY);
		Kursant kursant = getKursantMdt().get(getKursantId());

		if (kursant == null) {
			setText("Brak obiektu");
			return TEXT_RESULT;
		}
		getForm().setData(kursant);
		getSession().put(KURSANT_KEY, getForm());

		return EDIT;
	}

	public String delete() {
		Kursant kursant = getKursantMdt().get(getKursantId());

		if (kursant == null) {
			setText("Brak obiektu");
			return TEXT_RESULT;
		}

		if (!getKursantMdt().isPrzypisany(getKursantId())) {
			setText("Kursant aktualnie jest przypisany do jednego z instruktorów.<br/>Kursanta można wypisać w dziale Instruktorzy!");
			return TEXT_RESULT;
		}
		getKursantMdt().delete(kursant);

		setText("Kursant został poprawnie usunięty");
		return TEXT_RESULT;
	}

	public String saveNew() {
		if (getForm().getData() == null) {
			setText("Brak obiektu");
			return TEXT_RESULT;
		}

		if (!isValid(getForm().getData(), false)) {
			return TEXT_RESULT;
		}

		getForm().getData().setHaslo(Utils.convertToMd5(getForm().getData().getHaslo()));
		getKursantMdt().makePersistent(getForm().getData());

		getSession().remove(KURSANT_KEY);
		setText("Kursant został poprawnie dodany");

		return TEXT_RESULT;
	}

	public String save() {
		Kursant kursantEdytowany = ((KursantForm) getSession().get(KURSANT_KEY)).getData();
		Kursant kursantNowy = getForm().getData();

		if (kursantEdytowany == null) {
			setText("Brak kursanta !");
			return TEXT_RESULT;
		}

		if (!isValid(kursantNowy, true)) {
			return TEXT_RESULT;
		}

		kursantNowy.setHaslo(Utils.convertToMd5(kursantNowy.getHaslo()));
		float godzJazdy = kursantEdytowany.getGodzJazdy();
		float godzWykladu = kursantEdytowany.getGodzWykladu();
		if (!kursantEdytowany.compareAndCopy(kursantNowy)) {
			setText("Brak zmian po edycji !");
			return TEXT_RESULT;
		}

		kursantEdytowany.setGodzJazdy(godzJazdy);
		kursantEdytowany.setGodzWykladu(godzWykladu);

		getKursantMdt().makePersistent(kursantEdytowany);
		getSession().remove(KURSANT_KEY);
		//
		setText("Kursant został poprawnie zmieniony");
		return TEXT_RESULT;
	}

	public int getKursantId() {
		return kursantId;
	}

	public void setKursantId(int kursantId) {
		this.kursantId = kursantId;
	}

	private KursantMdt getKursantMdt() {
		if (kursantMdt == null)
			kursantMdt = new KursantMdt();
		return kursantMdt;
	}

	public KursantForm getForm() {
		if (form == null)
			form = new KursantForm();
		return form;
	}

	public void setForm(KursantForm form) {
		this.form = form;
	}

}
